package com.zenithmind.chat.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.chat.pojo.entity.ChatMessageStatistics;
import com.zenithmind.chat.pojo.vo.ChatMessageStatisticsVO;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 消息统计服务接口 - 遵循单一职责原则
 * 只负责消息统计的业务逻辑处理
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface ChatMessageStatisticsService extends IService<ChatMessageStatistics> {

    /**
     * 创建消息统计记录
     * 
     * @param messageId 消息ID
     * @param userId 用户ID
     * @param groupId 群组ID
     * @return 统计记录ID
     */
    String createMessageStatistics(String messageId, String userId, String groupId);

    /**
     * 根据消息ID查询统计信息
     * 
     * @param messageId 消息ID
     * @return 统计信息
     */
    ChatMessageStatisticsVO getStatisticsByMessageId(String messageId);

    /**
     * 增加点赞数
     * 
     * @param messageId 消息ID
     * @return 更新结果
     */
    Boolean incrementLikeCount(String messageId);

    /**
     * 减少点赞数
     * 
     * @param messageId 消息ID
     * @return 更新结果
     */
    Boolean decrementLikeCount(String messageId);

    /**
     * 增加回复数
     * 
     * @param messageId 消息ID
     * @return 更新结果
     */
    Boolean incrementReplyCount(String messageId);

    /**
     * 减少回复数
     * 
     * @param messageId 消息ID
     * @return 更新结果
     */
    Boolean decrementReplyCount(String messageId);

    /**
     * 增加转发数
     * 
     * @param messageId 消息ID
     * @return 更新结果
     */
    Boolean incrementForwardCount(String messageId);

    /**
     * 增加阅读数
     * 
     * @param messageId 消息ID
     * @return 更新结果
     */
    Boolean incrementReadCount(String messageId);

    /**
     * 批量增加阅读数
     * 
     * @param messageIds 消息ID列表
     * @return 更新结果
     */
    Boolean batchIncrementReadCount(List<String> messageIds);

    /**
     * 获取用户消息统计
     * 
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计信息列表
     */
    List<ChatMessageStatisticsVO> getUserMessageStatistics(String userId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取群组消息统计
     * 
     * @param groupId 群组ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计信息列表
     */
    List<ChatMessageStatisticsVO> getGroupMessageStatistics(String groupId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 统计用户消息总数
     * 
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 消息总数
     */
    Long countUserMessages(String userId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 统计群组消息总数
     * 
     * @param groupId 群组ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 消息总数
     */
    Long countGroupMessages(String groupId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取热门消息排行
     * 
     * @param groupId 群组ID
     * @param rankType 排行类型（like-点赞，reply-回复，forward-转发，read-阅读）
     * @param limit 数量限制
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 热门消息列表
     */
    List<ChatMessageStatisticsVO> getPopularMessages(String groupId, String rankType, Integer limit, 
                                                     LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取用户活跃度统计
     * 
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 活跃度统计
     */
    Object getUserActivityStatistics(String userId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取群组活跃度统计
     * 
     * @param groupId 群组ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 活跃度统计
     */
    Object getGroupActivityStatistics(String groupId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取消息类型分布统计
     * 
     * @param groupId 群组ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 类型分布统计
     */
    Object getMessageTypeDistribution(String groupId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取消息时间分布统计
     * 
     * @param groupId 群组ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param granularity 时间粒度（hour-小时，day-天，week-周，month-月）
     * @return 时间分布统计
     */
    Object getMessageTimeDistribution(String groupId, LocalDateTime startTime, LocalDateTime endTime, String granularity);

    /**
     * 获取用户互动统计
     * 
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 互动统计
     */
    Object getUserInteractionStatistics(String userId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取群组成员活跃排行
     * 
     * @param groupId 群组ID
     * @param rankType 排行类型（message-消息数，like-点赞数，reply-回复数）
     * @param limit 数量限制
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 成员活跃排行
     */
    List<Object> getGroupMemberActivityRank(String groupId, String rankType, Integer limit, 
                                           LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 生成统计报告
     * 
     * @param reportType 报告类型（user-用户报告，group-群组报告）
     * @param targetId 目标ID（用户ID或群组ID）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param format 报告格式（json，excel，pdf）
     * @return 报告文件路径
     */
    String generateStatisticsReport(String reportType, String targetId, LocalDateTime startTime, 
                                   LocalDateTime endTime, String format);

    /**
     * 清理过期统计数据
     * 
     * @param retentionDays 保留天数
     * @return 清理数量
     */
    Integer cleanupExpiredStatistics(Integer retentionDays);

    /**
     * 重新计算统计数据
     * 
     * @param messageId 消息ID
     * @return 重新计算结果
     */
    Boolean recalculateStatistics(String messageId);

    /**
     * 批量重新计算统计数据
     * 
     * @param messageIds 消息ID列表
     * @return 重新计算结果
     */
    Boolean batchRecalculateStatistics(List<String> messageIds);

    /**
     * 导出统计数据
     * 
     * @param exportType 导出类型
     * @param targetId 目标ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param format 导出格式
     * @return 导出文件路径
     */
    String exportStatistics(String exportType, String targetId, LocalDateTime startTime, 
                           LocalDateTime endTime, String format);

    /**
     * 获取实时统计数据
     * 
     * @param statisticsType 统计类型
     * @param targetId 目标ID
     * @return 实时统计数据
     */
    Object getRealTimeStatistics(String statisticsType, String targetId);
}
